//
//  WBNetworkManager.swift
//  weibo
//
//  Created by HanXujie on 2017/4/20.
//  Copyright © 2017年 thinker. All rights reserved.
//

import UIKit
import AFNetworking

enum WBHTTPMethod {
    case GET
    case POST
}
class WBNetworkManager: AFHTTPSessionManager {

    /// 单例，静态变量，本质是一个闭包，在第一次访问时执行闭包，并且将结果保存在share中
    static let shared = WBNetworkManager()
    
    /// 访问令牌，所有网络请求都基于此令牌（登录除外）
    /// 为了保护用户安全，token是有限的，默认用户是三天
    var accessToken: String? //= "2.001MbSCCvGlRzC73e6801c01_Bye9E"
    
    /// 微博账户的UID
    var uid:String? = "1866251232"
    
    
    /// 用户登录标记（注意：这里是一个计算型属性，省略了get）
    var userLogin: Bool {
        return accessToken != nil
    }
    
    
    func tokenRequest(method:WBHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool)->Void ) -> () {
        
        // 处理token字典
        // 判断token是否为nil
        /*
         针对403用户token过期
         对于测试用户（应用程序还没有提交给新浪微博审核）每天的刷新量是有限的
         如果超出上限token会被锁定一段时间
         解决办法是，新建一个应用程序
         
         */
        guard let token = accessToken else {
            completion(nil, false)
            // FIXME: 发送通知提示用户登录
            print("token为空！需要登录")
            completion(nil,false)
            return
            
        }
        // 判断token字典是否存在
        var parameters = parameters
         
        if parameters == nil {
            // 实例化字典
            parameters = [String: Any]()
        }
        
        // 设置字典
        parameters!["access_token"] = token
        
        // 调用request发送网络请求
        request(method: method, URLString: URLString, parameters: parameters, completion: completion)
        
    }
    
    /// 封装AFN的GET/POST请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URL
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典、数组)，是否成功]
    func request(method:WBHTTPMethod = .GET, URLString: String, parameters: [String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool)->Void){
        // 成功回调
        let success = {(task:URLSessionDataTask, json:Any?)->Void in
            completion(json,true)
        }
        // 失败回调
        let failure = {(task:URLSessionDataTask?, error:Error)->Void in
            // 打印错误信息
            print("网络请求错误\(error)")
            // 针对403处理用户token过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403{
                print("令牌过期了")
                // FIXME: 发送通知提示用户再次登录（谁接收到通知谁来处理）
                
            }
            

            completion(nil, false)
        }
        // 通过传过来的枚举值来判断POST/GET请求
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }else if method == .POST{
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
        
        
    }
    
    

}
